package pe.edu.upc.karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import pe.edu.upc.karaoke.excepcion.DAOExcepcion;
import pe.edu.upc.karaoke.modelo.*;
import pe.edu.upc.karaoke.util.ConexionBD;


public class SalaDAO extends BaseDAO {
		
	public Sala obtener(int idSala) throws DAOExcepcion {
		
		Sala sala = new Sala();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query = "SELECT IDSALA, NOMBRE, CAPACIDAD, DESCRIPCION FROM SALA WHERE IDSALA=? AND ELOG = 1";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idSala);
				rs = stmt.executeQuery();
				
				if (rs.next()) {
					sala.setIdsala(rs.getInt(1));
					sala.setNombre(rs.getString(2));
					sala.setCapacidad(rs.getInt(3));
					sala.setDescripcion(rs.getString(4));
				}	
		} catch (SQLException e) {
				sala = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return sala;
	}

	public List<Sala> buscarPorNombre(String nombre) throws DAOExcepcion {
		
		List<Sala> lista = new ArrayList<Sala>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			String query =	"SELECT S.IDSALA, S.NOMBRE, S.CAPACIDAD, S.DESCRIPCION, S.ELOG, S.IDLOCAL, L.NOMBRE AS NO_LOCAL FROM SALA S, LOCAL L " +
							"WHERE S.NOMBRE LIKE ? " +
							"AND S.IDLOCAL = L.IDLOCAL " +
							"AND S.ELOG = 1";
			
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, "%" + nombre + "%");
				rs = stmt.executeQuery();
				
				while (rs.next()) {
					Sala sala = new Sala();
					sala.setIdsala(rs.getInt("IDSALA"));
					sala.setNombre(rs.getString("NOMBRE"));
					sala.setCapacidad(rs.getInt("CAPACIDAD"));
					sala.setDescripcion(rs.getString("DESCRIPCION"));
					sala.setElog(rs.getInt("ELOG"));
					
					Local local = new Local();
					local.setNombre(rs.getString("NO_LOCAL"));
					
					sala.setLocal(local);
					
					lista.add(sala);
				}
		} 
		catch (SQLException e) {
				lista = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}

	public List<Sala> listarSala() throws DAOExcepcion {
		
		String query =	"SELECT S.IDSALA, S.NOMBRE, S.CAPACIDAD, S.DESCRIPCION, S.ELOG, S.IDLOCAL, L.NOMBRE AS NO_LOCAL FROM SALA S, LOCAL L" +
						" WHERE S.IDLOCAL = L.IDLOCAL " +
						"AND S.ELOG = 1";
		List<Sala> lista = new ArrayList<Sala>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {

				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				
				while (rs.next()) {
					Sala sala = new Sala();
					sala.setIdsala(rs.getInt("IDSALA"));
					sala.setNombre(rs.getString("NOMBRE"));
					sala.setCapacidad(rs.getInt("CAPACIDAD"));
					sala.setDescripcion(rs.getString("DESCRIPCION"));
					sala.setElog(rs.getInt("ELOG"));
					
					Local local = new Local();
					local.setNombre(rs.getString("NO_LOCAL"));
					sala.setLocal(local);
					
					lista.add(sala);
				}
		} 
		catch (SQLException e) {
				lista = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}

	
	public Sala insertar(Sala sala) throws DAOExcepcion {
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"INSERT INTO SALA (NOMBRE, CAPACIDAD, DESCRIPCION, ELOG, IDLOCAL) " +
								"VALUES (?,?,?,1,?)";
				
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, sala.getNombre());
				stmt.setInt(2, sala.getCapacidad());
				stmt.setString(3, sala.getDescripcion());
				stmt.setInt(4, sala.getLocal().getIdlocal());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO INSERTAR");
				}
	
				int id = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					id = rs.getInt(1);
				}
				sala.setIdsala(id);

		} catch (SQLException e) {
				sala = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return sala;
	}

	
	public String eliminar(int idSala) throws DAOExcepcion {
		
		Sala sala = new Sala();
		Connection con = null;
		PreparedStatement stmt = null;
		
		String vReturn = "NO_OK";
		try {
				String query = "UPDATE SALA SET ELOG = 0 WHERE IDSALA=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idSala);
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ELIMINAR");
				}else{
					vReturn = "OK";
				}
		} catch (SQLException e) {
				sala = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return vReturn;
	}

	
	public Sala actualizar(Sala sala) throws DAOExcepcion {
		
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
				String query =	"UPDATE SALA SET NOMBRE=?, CAPACIDAD=?, DESCRIPCION=?, IDLOCAL=? " +
								"WHERE IDSALA=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, sala.getNombre());
				stmt.setInt(2, sala.getCapacidad());
				stmt.setString(3, sala.getDescripcion());
				stmt.setInt(4, sala.getLocal().getIdlocal());
				stmt.setInt(5, sala.getIdsala());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ACTUALIZAR");
				}
		} catch (SQLException e) {
				sala = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return sala;
	}
	
}
